/*	--- MVC开发 ---

我们通过【前面的章节】可以看到：

· 【Servlet】适合编写【Java代码】, 实现【各种复杂的业务逻辑】, 但【不适合】输出【复杂的HTML】；
· 【JSP】适合编写【HTML】, 并在其中插入【动态内容】, 但【不适合】编写【复杂的Java代码】。


-----------------

Q: 能否将【两者结合起来】, 发挥【各自的优点】, 避免【各自的缺点】？
A: 答案是肯定的。我们来看一个具体的例子。


假设我们已经编写了【几个JavaBean】：	 */
public class User {
	public long id;
	public String name;
	public School school;
}

public class School {
	public String name;
	public String address;
}


/*
在【UserServlet】中, 我们可以从【数据库databse】中读取【User、School等信息】

然后, 把【读取到的JavaBean】先放到【HttpServletRequest】中, 再通过【forward()】传给【user.jsp】处理： */
@WebServlet(urlPatterns = "/user")
public class UserServlet extends HttpServlet {
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {

		// 假装从database读取
		School school = new School("No.1 Middle School", "101 South Street");
		User user = new User(123, "Bob", school);

		// 放入Request中
		req.setAttribute("user", user);

		// forward给user.jsp
		req.getRequestDispatcher("/WEB-INF/user.jsp").forward(req, resp);
	}
}


/*
在【/WEB-INF/user.jsp】中, 我们只负责【展示相关JavaBean的信息】, 不需要编写【访问数据库等】复杂逻辑： 
-------------------------------------------
<%@ page import="com.itranswarp.learnjava.bean.*"%>
<%
    User user = (User) request.getAttribute("user");
%>
<html>
<head>
    <title>Hello World - JSP</title>
</head>
<body>
    <h1>Hello <%= user.name %>!</h1>
    <p>School Name:
    <span style="color:red">
        <%= user.school.name %>
    </span>
    </p>
    <p>School Address:
    <span style="color:red">
        <%= user.school.address %>
    </span>
    </p>
</body>
</html>
------------------------------------------

请注意几点：

· 【需要展示的User】被放入【HttpServletRequest】中以便【传递给JSP】, 因为【一个请求】对应【一个HttpServletRequest】, 我们也【无需清理它】, 处理完【该请求】后【HttpServletRequest实例】将被丢弃；

· 把【user.jsp】放到【/WEB-INF/目录下】, 是因为【WEB-INF】是【一个特殊目录】, 【Web Server】会阻止【浏览器】对【WEB-INF目录下的任何资源】的访问, 这样就防止【用户】通过【/user.jsp路径】直接访问到【JSP页面】；

· 【JSP页面】首先通过
	<% 
		User user = (User) request.getAttribute("user");
	%>
从【request变量】获取【User实例】, 然后在【页面中】直接输出, 此处未考虑【HTML的转义问题】, 有【潜在安全风险】。


我们在【浏览器】访问【http://localhost:8080/user】, 【请求】首先由【UserServlet】处理, 然后交给【user.jsp】渲染：



我们
	把【UserServlet】看作【业务逻辑处理】 -- Controller
	把【User】看作【(数据)模型】 -- Model
	把【user.jsp】看作【渲染】 -- View

这种设计模式通常被称为
	MVC：Model-View-Controller
即
	[UserServlet]作为[控制器（Controller）]
	[User]作为[模型（Model）]
	[user.jsp]作为[视图（View）]


整个【MVC架构】如下：
	                   ┌───────────────────────┐
	             ┌────>│Controller: UserServlet│(HttpServlet)
	             │     └───────────────────────┘
	             │                 │
	┌───────┐    │           ┌─────┴─────┐
	│Browser│────┘           │Model: User│(class)
	│       │<───┐           └─────┬─────┘
	└───────┘    │                 │
	             │                 ▼
	             │     ┌───────────────────────┐
	             └─────│    View: user.jsp     │(HTML)
	                   └───────────────────────┘


使用【MVC模式】的好处是:
	1. 【Controller】专注于【业务处理】, 【Controller的处理结果】就是【Model】, 【Controller】只负责把【Model】传递给【View】, 
	2. 【Model】可以是【一个JavaBean】, 也可以是【一个包含多个Object的Map】, 
	3. 【View】只负责把【Model】给“渲染”出来

这样, 三者【职责明确】, 且开发更简单, 因为【开发Controller时】无需关注【页面】, 【开发View时】无需关心【如何创建Model】。

【MVC模式】广泛地应用在【Web页面】和【传统的桌面程序】中, 我们在这里通过【Servlet】和【JSP】实现了【一个简单的MVC模型】

但它【还不够简洁和灵活】, 后续我们会介绍【更简单的Spring MVC开发】。

===============================================================

#	练习

使用MVC开发
https://gitee.com/liaoxuefeng/learn-java/blob/master/practices/Java%E6%95%99%E7%A8%8B/200.Web%E5%BC%80%E5%8F%91.1255945497738400/60.MVC%E5%BC%80%E5%8F%91.1266264917931808/web-servlet-jsp.zip?utm_source=blog_lxf 
*/



/*================================================

#	小结

1. 【MVC模式】是一种【分离业务逻辑和显示逻辑的设计模式】, 广泛应用在Web和桌面应用程序。


*/


























































